package Gather.DataStructure;

import java.util.ArrayList;
import java.util.Iterator;

/**
 * ClassName:Iterator001
 * Package:Gather.DataStructure
 * Description:
 *
 * @Author:ZhangXin
 * @Create2023/2/7-15:58
 * @Version:v1.0
 */
public class Iterator001 {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("aaa");
        list.add("bbb");
        list.add("ccc");
        /*
         * iterator():生成一个一个迭代器对象,默认指向集合0索引处
         * hasNext():判断当前指向的位置是否有元素
         * next(): 1.获取元素  2. 移动指针*/
        Iterator<String> it = list.iterator();
        while (it.hasNext()) {
            String s = it.next();
            System.out.println(s);
        }
    }

//    public Iterator<E> iterator() {
//        return new ArrayList.Itr();
//        /*在底层实际上就是创建了一个内部类的对象,这个内部类就表示是ArrayList的迭代器
//         * 所以当我们调用多次这个方法的时候
//         * 那么相当于就是创建了多个迭代器的对象*/
//    }
//
//    private class Itr implements Iterator<E> {
//        int cursor;       // 光标,表示迭代器里面的指针,默认指向0索引的位置
//        int lastRet = -1; // 上一次操作的索引
//        int expectedModCount = modCount;//并发修改异常
//        //modCount集合变化的次数,每add或者remove一次,这个变量都会自增
//        //当我们创建迭代器对象的时候,就会把这个次数告诉迭代器
//
//        Itr() {
//        }
//
//        public boolean hasNext() {
//            return cursor != size;
//        }
//
//        @SuppressWarnings("unchecked")
//        public E next() {
//            //当前集合中最新的变化次数跟一开始记录的次数是否相同
//            //如果相同,证明当前集合没有发生改变
//            //如果不一样,证明在迭代器遍历集合的过程中,使用了集合中的方法添加/删除了元素
//
//            /*
//            * 结论：
//            * 在以后如何避免并发修改异常：
//            * 在使用迭代器或者是增强for遍历集合的过程中,不要使用集合的方法添加或者删除元素*/
//            checkForComodification();//检查次数
//            int i = cursor;//记录当前指针指向的索引位置
//            if (i >= size)
//                throw new NoSuchElementException();
//            Object[] elementData = ArrayList.this.elementData;
//            if (i >= elementData.length)
//                throw new ConcurrentModificationException();
//            cursor = i + 1;//把当前的指针往后移一个位置
//            return (E) elementData[lastRet = i];
//        }

    }
